#include <stdio.h>
#include <stdlib.h>

//统计时分多路复用
int multiplex_stdm(unsigned char *c,const int c_size,const unsigned char *a,const int a_len,const unsigned char *b,const int b_len)
{
    int i=0,j=0,k=0;
    while(i<a_len||j<b_len)
	{
        if(i<a_len&&a[i])
		{
            if(k>=c_size) return -1;//超出容量
            c[k++]=a[i++];
        }
        if(j<b_len&&b[j])
		{
            if(k>=c_size) return -1;//超出容量
            c[k++]=b[j++];
        }
        //跳过无效数据
        if(i<a_len&&!a[i]) i++;
        if(j<b_len&&!b[j]) j++;
    }
    return k;//返回实际使用的长度
}

//统计时分多路解复用
int demultiplex_stdm(unsigned char *a,const int a_size,unsigned char *b,const int b_size,const unsigned char *c,const int c_len)
{
    int i=0,j=0,k=0;
    while(k<c_len)
	{
        if(i<a_size) a[i++]=c[k++];
        if(j<b_size) b[j++]=c[k++];
    }
    return 0;
}

//同步时分多路复用
int multiplex_tdm(unsigned char *c,const int c_size,const unsigned char *a,const int a_len,const unsigned char *b,const int b_len)
{
    int max_len=a_len>b_len?a_len:b_len;
    if(max_len * 2>c_size) return -1; //超出容量

    for(int i=0;i<max_len;i++)
	{
        c[2*i]=(i<a_len)?a[i]:0;
        c[2*i+1]=(i<b_len)?b[i]:0;
    }
    return 2*max_len;//返回实际使用的长度
}

//同步时分多路解复用
int demultiplex_tdm(unsigned char *a,const int a_size,unsigned char *b,const int b_size,const unsigned char *c,const int c_len)
{
    for(int i=0;i<c_len/2;i++)
	{
        if(i<a_size) a[i]=c[2*i];
        if(i<b_size) b[i]=c[2*i+1];
    }
    return 0;
}

//频分多路复用
int multiplex_fdm(unsigned char *c,const int c_size,const unsigned char *a,const int a_len,const unsigned char *b,const int b_len)
{
    int max_len=a_len>b_len?a_len:b_len;
    if(max_len>c_size) return -1;//超出容量
    for(int i=0;i<max_len;i++)
	{
        c[i]=((i<a_len)?a[i]:0)+((i < b_len)?b[i]:0)*2;//调制到不同频率
    }
    return max_len; //返回实际使用的长度
}

//频分多路解复用
int demultiplex_fdm(unsigned char *a,const int a_size,unsigned char *b,const int b_size,const unsigned char *c,const int c_len)
{
    for(int i=0;i<c_len;i++)
	{
        if(i<a_size) a[i]=c[i]%2;//解调
        if(i<b_size) b[i]=c[i]/2;//解调
    }
    return 0;
}

//码分多路复用
int multiplex_cdm(unsigned char *c,const int c_size,const unsigned char *a,const int a_len,const unsigned char *b,const int b_len)
{
    int max_len=a_len>b_len?a_len:b_len;
    if(max_len>c_size) return -1;//超出容量
    for(int i=0;i<max_len;i++)
	{
        c[i]=((i < a_len)?a[i]:0)+((i < b_len)?b[i]:0)*3;//使用正交码
    }
    return max_len;//返回实际使用的长度
}

//码分多路解复用
int demultiplex_cdm(unsigned char *a,const int a_size,unsigned char *b,const int b_size,const unsigned char *c,const int c_len)
{
    for(int i=0;i<c_len;i++)
	{
        if(i<a_size) a[i]=c[i]%3;//解码
        if(i<b_size) b[i]=c[i]/3;//解码
    }
    return 0;
}

int main()
{
    unsigned char a[]={1,0,1,0,1};
    unsigned char b[]={0,1,0,1,0,1};
    unsigned char c[20];
    unsigned char a_out[10]={0};
    unsigned char b_out[10]={0};

    //统计时分多路复用测试
    int len=multiplex_stdm(c,20,a,5,b,6);
    demultiplex_stdm(a_out,5,b_out,6,c,len);
    printf("STDM:\nA: ");
    for(int i=0;i<5;i++) printf("%d ",a_out[i]);
    printf("\nB: ");
    for(int i=0;i<6;i++) printf("%d ",b_out[i]);
    printf("\n\n");

    //同步时分多路复用测试
    len=multiplex_tdm(c,20,a,5,b,6);
    demultiplex_tdm(a_out,5,b_out,6,c,len);
    printf("TDM:\nA: ");
    for(int i=0;i<5;i++) printf("%d ",a_out[i]);
    printf("\nB: ");
    for(int i=0;i<6;i++) printf("%d ",b_out[i]);
    printf("\n\n");

    //频分多路复用测试
    len=multiplex_fdm(c,20,a,5,b,6);
    demultiplex_fdm(a_out,5,b_out,6,c,len);
    printf("FDM:\nA: ");
    for(int i=0;i<5;i++) printf("%d ",a_out[i]);
    printf("\nB: ");
    for(int i=0;i<6;i++) printf("%d ",b_out[i]);
    printf("\n\n");

    //码分多路复用测试
    len = multiplex_cdm(c, 20, a,5,b,6);
    demultiplex_cdm(a_out,5,b_out,6,c,len);
    printf("CDM:\nA: ");
    for(int i=0;i<5;i++) printf("%d ",a_out[i]);
    printf("\nB: ");
    for(int i=0;i<6;i++) printf("%d ",b_out[i]);
    printf("\n");

    return 0;
}